package com.yun.unit;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.yun.mapper.ArticleMapper;
import com.yun.pojo.Article;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;


/**
 * 我们在读取excel文件的时候 会用到
 */
@Component
public class UserListener implements ReadListener<Article> {
    @Autowired
    private ArticleMapper articelDao;

    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 100;

    /**
     * 缓存数据
     */
    private List<Article> cache = ListUtils
            .newArrayListWithExpectedSize(BATCH_COUNT);

    @Override
    public void invoke(Article goodsDto, AnalysisContext analysisContext) {

        // 我每次从excel读取一条数据 封装成Article对象 把他存放到我刚才定义的集合中
        cache.add(goodsDto);

        // 集合中的元素个数 >=100
        if (cache.size() >= BATCH_COUNT) {
            saveData();// saveData中我会调用数据访问层对象 将刚才读取到的100个对象存放到mysql中
            // cache置为空List，方便gc work
            cache = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }

    }



    private void saveData() {
        System.out.println("开始存储数据数数据：" + cache.size());
        System.out.println(cache);
        // 把存放数据的集合传递到数据访问层
        articelDao.batchinsAll(cache);

    }

    /**
     * @param analysisContext 所有数据处理完，调用这里
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //  这里也要保存数据，
        //  确保最后遗留的数据也存储到数据库
        System.out.println("最终数据存储:");
        saveData();
        System.out.println("所有数据解析完成!");
    }

}
